package cn.com.blueInfo.bpm.person.service.impl;

import cn.com.blueInfo.bpm.person.convert.GroupInfoConvert;
import cn.com.blueInfo.bpm.person.entity.GroupInfo;
import cn.com.blueInfo.bpm.person.repository.GroupInfoRepository;
import cn.com.blueInfo.bpm.person.request.GroupInfoDTO;
import cn.com.blueInfo.bpm.person.response.GroupInfoVO;
import cn.com.blueInfo.bpm.person.service.GroupInfoService;
import cn.com.blueInfo.core.util.SnowflakeIdGenerator;
import cn.com.blueInfo.utils.result.ResultInfo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 群组信息表 业务服务实现类
 * @author suxch
 * @since 2025-09-01 19:28:09
 */
@Log4j2
@Service
public class GroupInfoServiceImpl implements GroupInfoService {

    @Autowired
    private GroupInfoRepository groupInfoRepository;

    @Autowired
    private SnowflakeIdGenerator snowflakeIdGenerator;

    @Autowired
    private GroupInfoConvert groupInfoConvert;

    /**
     * 新增群组信息
     * @param groupInfoDTO 群组信息参数
     */
    @Override
    public ResultInfo<Integer> addGroupInfo(GroupInfoDTO groupInfoDTO) {
        GroupInfo groupInfo = groupInfoConvert.dtoToEntity(groupInfoDTO);
        groupInfo.setId(snowflakeIdGenerator.nextId());
        Integer addSize = groupInfoRepository.createGroupInfo(groupInfo);
        return ResultInfo.<Integer>builder().data(addSize).message("群组信息成功新增 {} 条").build();
    }

    /**
     * 批量新增群组信息
     * @param groupInfoDTOList 群组信息参数列表
     */
    @Override
    public ResultInfo<Integer> batchAddGroupInfo(List<GroupInfoDTO> groupInfoDTOList) {
        List<GroupInfo> groupInfoList = groupInfoConvert.dtoToEntity(groupInfoDTOList);
        for (GroupInfo groupInfo : groupInfoList) groupInfo.setId(snowflakeIdGenerator.nextId());
        Integer addSize = groupInfoRepository.batchCreateGroupInfo(groupInfoList);
        return ResultInfo.<Integer>builder().data(addSize).message("群组信息成功新增 {} 条").build();
    }

    /**
     * 删除群组信息
     * @param groupInfoId 群组信息ID
     */
    @Override
    public ResultInfo<Integer> removeGroupInfo(Long groupInfoId) {
        Integer removeSize = groupInfoRepository.deleteGroupInfo(groupInfoId);
        return ResultInfo.<Integer>builder().data(removeSize).message("群组信息成功删除 {} 条").build();
    }

    /**
     * 批量删除群组信息
     * @param groupInfoIdList 群组信息ID列表
     */
    @Override
    public ResultInfo<Integer> batchRemoveGroupInfo(List<Long> groupInfoIdList) {
        Integer removeSize = groupInfoRepository.batchDeleteGroupInfo(groupInfoIdList);
        return ResultInfo.<Integer>builder().data(removeSize).message("群组信息成功删除 {} 条").build();
    }

    /**
     * 更新部分群组信息
     * @param groupInfoUpdatePartialDTO 群组信息参数
     */
    @Override
    public ResultInfo<Integer> modifyGroupInfoPartial(GroupInfoDTO.UpdatePartialDTO groupInfoUpdatePartialDTO) {
        GroupInfo groupInfo = groupInfoConvert.dtoToEntity(groupInfoUpdatePartialDTO);
        Integer modifySize = groupInfoRepository.updateGroupInfoPartial(groupInfo);
        return ResultInfo.<Integer>builder().data(modifySize).message("群组信息成功更新 {} 条").build();
    }

    /**
     * 更新全部群组信息
     * @param groupInfoDTO 群组信息参数
     */
    @Override
    public ResultInfo<Integer> modifyGroupInfo(GroupInfoDTO groupInfoDTO) {
        GroupInfo groupInfo = groupInfoConvert.dtoToEntity(groupInfoDTO);
        Integer modifySize = groupInfoRepository.updateGroupInfo(groupInfo);
        return ResultInfo.<Integer>builder().data(modifySize).message("群组信息成功更新 {} 条").build();
    }

    /**
     * 查询一条群组信息
     * @param groupInfoId 群组信息ID
     */
    @Override
    public ResultInfo<GroupInfoVO> queryGroupInfoById(Long groupInfoId) {
        GroupInfo groupInfo = groupInfoRepository.getGroupInfoById(groupInfoId);
        GroupInfoVO groupInfoVO = groupInfoConvert.entityToVO(groupInfo);
        return ResultInfo.<GroupInfoVO>builder().data(groupInfoVO).message("群组信息查询成功").build();
    }

    /**
     * 分页查询群组信息
     * @param groupInfoQueryDTO 群组信息参数
     */
    @Override
    public ResultInfo<Page<GroupInfoVO>> queryGroupInfoPage(GroupInfoDTO.QueryDTO groupInfoQueryDTO) {
        Page<GroupInfo> groupInfoPage = groupInfoRepository.getGroupInfoPage(groupInfoQueryDTO);
        Page<GroupInfoVO> resultData = groupInfoConvert.convertPage(groupInfoPage);
        return ResultInfo.<Page<GroupInfoVO>>builder()
                .data(resultData)
                .message("群组信息分页查询成功，共 {} 条", resultData.getRecords().size())
                .build();
    }

    /**
     * 根据条件查询 群组信息 数量
     * @param groupInfoQueryDTO 群组信息参数
     */
    @Override
    public ResultInfo<Long> queryGroupInfoCount(GroupInfoDTO.QueryDTO groupInfoQueryDTO) {
        Long resultCount = groupInfoRepository.getGroupInfoCount(groupInfoQueryDTO);
        return ResultInfo.<Long>builder()
                .data(resultCount)
                .message("群组信息数量查询成功，共 {} 条", resultCount)
                .build();
    }

    /**
     * 根据条件查询 群组信息
     * @param groupInfoQueryDTO 群组信息参数
     */
    @Override
    public ResultInfo<List<GroupInfoVO>> queryGroupInfoList(GroupInfoDTO.QueryDTO groupInfoQueryDTO) {
        List<GroupInfo> groupInfoList = groupInfoRepository.getGroupInfoList(groupInfoQueryDTO);
        List<GroupInfoVO> resultData = groupInfoConvert.entityListToVoList(groupInfoList);
        return ResultInfo.<List<GroupInfoVO>>builder()
                .data(resultData)
                .message("群组信息分页查询成功，共 {} 条", resultData.size())
                .build();
    }
}
